package com.whxd.smarthome.api.v1.dh.ws;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;

import org.apache.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hsview.client.HsviewClient;
import com.hsview.client.api.civil.user.GetAccessToken;
import com.whxd.framework.security.SecurityUtils;
import com.whxd.smarthome.Config;
import com.whxd.smarthome.util.MediaTypes;

@Path("/v1/dh/user")
public class UserJaxRsService {

	private static Logger logger = LoggerFactory.getLogger(UserJaxRsService.class);
	private static ObjectMapper mapper = new ObjectMapper();

	@Context
	private HttpServletRequest request;

//	@POST
//	@Path("/AddUser")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public Response AddUser(AddUserDto dto) {
//		try {
//			logger.info("AddUser data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		AddSubUser req = new AddSubUser();
//		req.data.username = Config.devUser;
//
//		for (SubUserDto sub : dto.getSubUsers()) {
//			AddSubUser.RequestData.SubUsersElement element = new AddSubUser.RequestData.SubUsersElement();
//			element.username = sub.getUsername();
//			req.data.subUsers.add(element);
//		}
//
//		AddSubUser.Response resp = (AddSubUser.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("AddUser " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("AddUser Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//
//	}
//
//	@POST
//	@Path("/AddSubUser")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public Response AddSubUser(AddSubUserDto dto) {
//		try {
//			logger.info("AddSubUser data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		AddSubUser req = new AddSubUser();
//		req.data.username = dto.getUsername();
//
//		for (SubUserDto sub : dto.getSubUsers()) {
//			AddSubUser.RequestData.SubUsersElement element = new AddSubUser.RequestData.SubUsersElement();
//			element.username = sub.getUsername();
//			req.data.subUsers.add(element);
//		}
//
//		AddSubUser.Response resp = (AddSubUser.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("AddSubUser " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("AddSubUser Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//
//	}
//
//	@POST
//	@Path("/GetUser")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public Response GetUser() throws JsonProcessingException {
//		logger.info("GetUser data: " + Config.devUser);
//
//		HttpSession session = request.getSession();
//		Enumeration<String> attributeNames = session.getAttributeNames();
//		while (attributeNames.hasMoreElements()) {
//			String name = attributeNames.nextElement();
//			System.out.println(name + ":\t" + session.getAttribute(name));
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); 
//
//		GetSubUser req = new GetSubUser();
//		req.data.username = Config.devUser;
//
//		GetSubUser.Response resp = (GetSubUser.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("GetSubUser " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("GetSubUser Error req:" + mapper.writeValueAsString(Config.devUser));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//	}
//
//	@POST
//	@Path("/GetSubUser")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public Response GetSubUser(GetSubUserDto dto) {
//		try {
//			logger.info("GetSubUser data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		GetSubUser req = new GetSubUser();
//		req.data.username = dto.getUsername();
//
//		GetSubUser.Response resp = (GetSubUser.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("GetSubUser " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("GetSubUser Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//	}
//
//	@POST
//	@Path("/DeleteUser")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public Response DeleteUser(DeleteUserDto dto) {
//		try {
//			logger.info("DeleteUser data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		DeleteSubUser req = new DeleteSubUser();
//		req.data.username = Config.devUser;
//		for (String user : dto.getSubUsers()) {
//			req.data.subUsers.add(user);
//		}
//
//		DeleteSubUser.Response resp = (DeleteSubUser.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("DeleteUser " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("DeleteUser Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//	}
//
//	@POST
//	@Path("/DeleteSubUser")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public Response DeleteSubUser(DeleteSubUserDto dto) {
//		try {
//			logger.info("DeleteSubUser data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		DeleteSubUser req = new DeleteSubUser();
//		req.data.username = Config.devUser;
//		for (String user : dto.getSubUsers()) {
//			req.data.subUsers.add(user);
//		}
//
//		DeleteSubUser.Response resp = (DeleteSubUser.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("DeleteSubUser " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("DeleteSubUser Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//	}

	@POST
	@Path("/GetAccessToken")
	@Produces(MediaTypes.JSON_UTF_8)
	@Consumes(MediaTypes.JSON_UTF_8)
	public Response GetAccessToken() {

		HsviewClient m_client = new HsviewClient();
		m_client.setHost(Config.host);
		m_client.setAuth(Config.devUser, Config.devPassword); 

		GetAccessToken req = new GetAccessToken();
		req.data.username = SecurityUtils.getCurrentSecurityUser().getUsername();
		logger.info("GetAccessToken data:" + req.data.username);
		
		GetAccessToken.Response resp = (GetAccessToken.Response) m_client.request(req, 30000);

		if (resp != null) {
			logger.info("GetAccessToken " + resp.getBody());
			return Response.status(resp.getCode()).entity(resp.getBody()).build();
		} else {
			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
		}

	}
}